// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_H_
#define UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_H_

#include "ui/accessibility/ax_enums.h"
#include "ui/accessibility/ax_export.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/native_widget_types.h"

namespace ui {

struct AXNodeData;
class AXPlatformNode;

// An object that wants to be accessible should derive from this class.
// AXPlatformNode subclasses use this interface to query all of the information
// about the object in order to implement native accessibility APIs.
//
// Note that AXPlatformNode has support for accessibility trees where some
// of the objects in the tree are not implemented using AXPlatformNode.
// For example, you may have a native window with platform-native widgets
// in it, but in that window you have custom controls that use AXPlatformNode
// to provide accessibility. That's why GetParent, ChildAtIndex, HitTestSync,
// and GetFocus all return a gfx::NativeViewAccessible - so you can return a
// native accessible if necessary, and AXPlatformNode::GetNativeViewAccessible
// otherwise.
class AX_EXPORT AXPlatformNodeDelegate {
public:
    // Get the accessibility data that should be exposed for this node.
    // Virtually all of the information is obtained from this structure
    // (role, state, name, cursor position, etc.) - the rest of this interface
    // is mostly to implement support for walking the accessibility tree.
    virtual const AXNodeData& GetData() = 0;

    // Get the parent of the node, which may be an AXPlatformNode or it may
    // be a native accessible object implemented by another class.
    virtual gfx::NativeViewAccessible GetParent() = 0;

    // Get the number of children of this node.
    virtual int GetChildCount() = 0;

    // Get the child of a node given a 0-based index.
    virtual gfx::NativeViewAccessible ChildAtIndex(int index) = 0;

    // Get the offset to convert local coordinates to screen global coordinates.
    virtual gfx::Vector2d GetGlobalCoordinateOffset() = 0;

    // Do a *synchronous* hit test of the given location in global screen
    // coordinates, and the node within this node's subtree (inclusive) that's
    // hit, if any.
    //
    // If the result is anything other than this object or NULL, it will be
    // hit tested again recursively - that allows hit testing to work across
    // implementation classes. It's okay to take advantage of this and return
    // only an immediate child and not the deepest descendant.
    //
    // This function is mainly used by accessibility debugging software.
    // Platforms with touch accessibility use a different asynchronous interface.
    virtual gfx::NativeViewAccessible HitTestSync(int x, int y) = 0;

    // Return the node within this node's subtree (inclusive) that currently
    // has focus.
    virtual gfx::NativeViewAccessible GetFocus() = 0;

    //
    // Events.
    //

    // Return the platform-native GUI object that should be used as a target
    // for accessibility events.
    virtual gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() = 0;

    //
    // Actions.
    //

    // Perform the default action, e.g. click a button, follow a link, or
    // toggle a checkbox.
    virtual void DoDefaultAction() = 0;

    // Change the value of a control, such as the text content of a text field.
    virtual bool SetStringValue(const base::string16& new_value) = 0;
};

} // namespace ui

#endif // UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_H_
